package com.kaithan.framework.common.excel;

import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.event.AnalysisEventListener;
import com.kaithan.framework.common.util.ReflectionUtil;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * 类描述：读取excel的监听器
 *
 * @author ZhuYin
 * @since 2025年02月05日
 */
@Getter
@Slf4j
public class BaseExcelListener<T> extends AnalysisEventListener<T> {
    /**
     * 用于存储读取到的Excel数据对象列表
     */
    private final List<T> dataList = new ArrayList<>();

    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        // 获取当前行号
        int currentRowNum = analysisContext.readRowHolder().getRowIndex() + 1;
        try {
            // 为方便调用方校验数据根据行号进行提示，这里将读取到的行号回写到泛型对象的rowNum字段中
            ReflectionUtil.setFieldValue(t, "rowNum", currentRowNum);
        } catch (Exception e) {
            if (e instanceof NoSuchFieldException) {
                log.error("请确保excel导入的泛型对象中存在 rowNum 属性:{}", e.getMessage());
            } else {
                log.error("反射设置字段值异常:", e);
            }
        }
        // 每读取一行数据，就将其添加到dataList中
        dataList.add(t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 当所有数据读取完成后，可以在这里进行一些后续操作，如打印读取到的数据数量
        log.info("读取完成，共读取了 {} 条数据", dataList.size());
    }

}